package com.wsc.singleton;

/**
 * 双重判断单例模式
 * volatile 是为了防止初始化对象的时候指令重排序
 */
public class DCLPattern {
    private volatile static DCLPattern INSTANCE;

    /**
     * 私有化构造器
     */
    private DCLPattern(){}

    public static DCLPattern getInstance(){
        if (INSTANCE == null){ // 第一次检查，进入同步代码块
            synchronized (DCLPattern.class){
                if (INSTANCE == null){ // 第二次检查
                    try {
                        Thread.sleep(1);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    INSTANCE = new DCLPattern();
                }
            }
        }
        return INSTANCE;
    }

    /**
     * 多个线程调用这个方法,检查对象是否一样
     */
    public static void main(String[] args) {
        for (int i = 0; i < 100 ; i++) {
            new Thread(()->{
                System.out.println(DCLPattern.getInstance().hashCode());
            }).start();
        }
    }
}
